AllGather

将各输入分片的数据进行 全量收集(All-Gather), 并在输出中按指定维度进行拼接复制。 该算子通常用于并行/多核场景中,将每个 rank 的本地数据 收集成一个完整的输出张量。

算子行为可概括为两步: 1. 将 input 中每个 input_rank 对应的数据块拷贝到 output 的首段连续区域; 2. 将首段完整数据复制到其余 output_rank - 1 个位置,形成完整聚合结果。

输入:
  • input - 输入数据地址,按 [input_rank, data_size] 形式连续存储。

  • input_rank - 输入 rank 数量(通常对应参与 AllGather 的并行单元数)。

  • output_rank - 输出 rank 数量(通常等于或大于 input_rank)。

  • data_size - 单个 rank 对应的数据元素个数。

  • core_mask - 核掩码(仅适用于共享存储版本)。

输出:
  • output - AllGather 结果输出地址, 数据按 [output_rank, input_rank, data_size] 的逻辑顺序存储。

支持平台:

FT78NE MT7004

备注

  • FT78NE 支持 fp32fp64int8int16int32cplx64cplx128 类型

  • MT7004 支持 fp16fp32int16int32cplx64 类型

  • 当前实现基于 DMA进行数据搬运

  • 输入与输出地址需保证足够的连续空间以容纳聚合结果

共享存储版本:

void fp_allgather_s(float *input, float *output, int input_rank, int output_rank, int data_size, int core_mask)
void dp_allgather_s(double *input, double *output, int input_rank, int output_rank, int data_size, int core_mask)
void i8_allgather_s(int8_t *input, int8_t *output, int input_rank, int output_rank, int data_size, int core_mask)
void i16_allgather_s(int16_t *input, int16_t *output, int input_rank, int output_rank, int data_size, int core_mask)
void i32_allgather_s(int32_t *input, int32_t *output, int input_rank, int output_rank, int data_size, int core_mask)
void c64_allgather_s(cplx64 *input, cplx64 *output, int input_rank, int output_rank, int data_size, int core_mask)
void c128_allgather_s(cplx128 *input, cplx128 *output, int input_rank, int output_rank, int data_size, int core_mask)

C调用示例:

 1// FT78NE 示例
 2#include <stdio.h>
 3#include <allgather.h>
 4
 5int main(int argc, char* argv[]) {
 6    float *input = (float *)0xA0000000;
 7    float *output = (float *)0xC0000000;
 8
 9    int input_rank = 4;
10    int output_rank = 4;
11    int data_size = 256;
12    int core_mask = 0xff;
13
14    fp_allgather_s(input, output,
15                   input_rank, output_rank,
16                   data_size, core_mask);
17    return 0;
18}

私有存储版本:

void fp_allgather_p(float *input, float *output, int input_rank, int output_rank, int data_size)
void dp_allgather_p(double *input, double *output, int input_rank, int output_rank, int data_size)
void i8_allgather_p(int8_t *input, int8_t *output, int input_rank, int output_rank, int data_size)
void i16_allgather_p(int16_t *input, int16_t *output, int input_rank, int output_rank, int data_size)
void i32_allgather_p(int32_t *input, int32_t *output, int input_rank, int output_rank, int data_size)
void c64_allgather_p(cplx64 *input, cplx64 *output, int input_rank, int output_rank, int data_size)
void c128_allgather_p(cplx128 *input, cplx128 *output, int input_rank, int output_rank, int data_size)

C调用示例:

 1// FT78NE 示例
 2#include <stdio.h>
 3#include <allgather.h>
 4
 5int main(int argc, char* argv[]) {
 6    float *input = (float *)0x10810000;   // L2 空间
 7    float *output = (float *)0x10820000;
 8
 9    int input_rank = 4;
10    int output_rank = 4;
11    int data_size = 256;
12
13    fp_allgather_p(input, output,
14                   input_rank, output_rank,
15                   data_size);
16    return 0;
17}